package com.me.study.javaBasic.collection;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;

public class TestConcurrentHashMap {

    public static void main(String[] args) {
        Map<String, Object> map = new ConcurrentHashMap<>(4);
        System.out.println("putIfAbsent(): 先 get()，如果 value 为 null，则 put 并返回 null;" +
                "否则返回当前值（不会把value放进去）");
        assertNull("key不存在（或 value 为 null）才put，并返回旧值", map.putIfAbsent("tom", "2333"));
        assertEquals("存在就不操作，并返回旧值",
                "2333", map.putIfAbsent("tom", "999"));
        assertEquals("获取值",
                "2333", map.get("tom"));

        System.out.println("\ncomputeIfAbsent(): 先 get()，如果 value 射为 null，则计算函数结果后 put，并返回计算结果；" +
                "否则返回 get的值");
        assertEquals("key不存在（或 value 为 null）就计算并存入 map，并返回 value",
                "hhh", map.computeIfAbsent("ljy", s -> "hhh"));
        assertEquals("存在就不操作，并返回 旧值",
                "hhh", map.computeIfAbsent("ljy", s -> "asdad"));
        assertEquals("获取值",
                "hhh", map.get("ljy"));



        String changeVal = "=====asdasgs";
        System.out.println("\ncomputeIfPresent(): 如果指定键存在且不为 null，则使用对应键值对咋样咋样，并返回计算结果；" +
                "否则返回 null");
        System.out.println("jack 初始值：\n\t" + map.get("jack"));
        map.computeIfPresent("jack", (key, oldValue) -> {
            // TODO key不存在时不执行
            System.out.println("第一次 key：" + key);
            System.out.println("第一次 oldValue：" + oldValue);
            return oldValue + changeVal;
        });// null
        System.out.println("第一次 computeIfPresent：\n\t" + map.get("jack"));
        map.put("jack", "坑爹");

        map.computeIfPresent("jack", (key, oldValue) -> {
            System.out.println("第二次 key：\n\t" + key);// jack
            System.out.println("第二次 oldValue：\n\t" + oldValue);// 坑爹
            return oldValue + changeVal;
        });// 坑爹
        System.out.println("第二次 computeIfPresent：\n\t" + map.get("jack"));

    }
}
